package com.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

public class SelectSort {
    public static void main(String[] args) {
        //int [] arr = {101,34,119,1};

        //测试一下冒泡的速度O(n^2),给八万个数据，测试
        //创建要给80000个的随机数组
        int[] arr =new int[80000];
        for (int i = 0; i < 80000; i++) {
            //生成一个[0，80000]数
            arr[i] = (int)(Math.random()*80000);
        }

        //System.out.println("排序前");
        //System.out.println(Arrays.toString(arr));

        //测试排序前的时间
        Date date2 = new Date();
        //输出时间格式
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-mm-dd HH:mm:ss");
        //有了这些我们可以拿到一个字符串
        String deta2 = simpleDateFormat.format(date2);
        System.out.println("排序前的时间"+deta2);

        selectSort(arr);
        //System.out.println("排序后");
        //System.out.println(Arrays.toString(arr));

        Date date3 = new Date();
        //有了这些我们可以拿到一个字符串
        String deta3 = simpleDateFormat.format(date3);
        System.out.println("排序后的时间"+deta3);
    }

    /**
     * 选择排序
     *  使用逐步推导得方式来讲解选择排序
     *  第一轮
     *  原始的数组：101，34，119，1
     *  第一轮排序：1，34，119，101
     *  算法的思想  先简单———》再复杂，就是可以把一个复杂算法，拆分成简单的问题——》逐步解决
     *
     *  DuanXS
     */
    public static void selectSort(int [] arr){

        //在推到过程中，发现规律，因此用一个for循环来解决
        //选择排序时间复杂度是0（n^2）
        for (int i = 0; i <arr.length-1 ; i++) {
            //第i轮
            int minIndex = i;
            int min = arr[i];
            for (int j = i+1; j <arr.length ; j++) {
                //如果min》arr[j]  说明假定的最小值，并不是最小的
                //这里是从小到大的  如果想从大到小  这里只需要把 min > arr[j]  大于号换成小于号
                if (min > arr[j]){
                    //重置min
                    min = arr[j];
                    //重置minIndex
                    minIndex = j;
                }
            }
            //将最小值，放到arr[0],及交换
            if (minIndex != i) {
                arr[minIndex] = arr[i];
                arr[i] = min;
            }
           // System.out.println("第"+(i+1)+"轮后~~");
           // System.out.println(Arrays.toString(arr));
        }
        
/*
        //第一轮
        int minIndex = 0;
        int min = arr[0];
        for (int j = 0+1; j <arr.length ; j++) {
            //如果min》arr[j]  说明假定的最小值，并不是最小的
            if (min > arr[j]){
                //重置min
                min = arr[j];
                //重置minIndex
                minIndex = j;
            }
        }
        //将最小值，放到arr[0],及交换
        if (minIndex != 0) {
            arr[minIndex] = arr[0];
            arr[0] = min;
        }
        System.out.println("第一轮后~~");
        System.out.println(Arrays.toString(arr));

        //第二轮
         minIndex = 1;
         min = arr[1];
        for (int j = 1+1; j <arr.length ; j++) {
            //如果min》arr[j]  说明假定的最小值，并不是最小的
            if (min > arr[j]){
                //重置min
                min = arr[j];
                //重置minIndex
                minIndex = j;
            }
        }
        //将最小值，放到arr[0],及交换
        if (minIndex != 1) {
            arr[minIndex] = arr[1];
            arr[1] = min;
        }
        System.out.println("第二轮后~~");
        System.out.println(Arrays.toString(arr));

        //第三轮
        minIndex = 2;
        min = arr[2];
        for (int j = 2+1; j <arr.length ; j++) {
            //如果min》arr[j]  说明假定的最小值，并不是最小的
            if (min > arr[j]){
                //重置min
                min = arr[j];
                //重置minIndex
                minIndex = j;
            }
        }
        //将最小值，放到arr[0],及交换
        if (minIndex != 2) {
            arr[minIndex] = arr[2];
            arr[2] = min;
        }
        System.out.println("第三轮后~~");
        System.out.println(Arrays.toString(arr));
 */
    }
}
